//给你一个字符串 s ，仅反转字符串中的所有元音字母，并返回结果字符串。 
//
// 元音字母包括 'a'、'e'、'i'、'o'、'u'，且可能以大小写两种形式出现不止一次。 
//
// 
//
// 示例 1： 
//
// 
//输入：s = "hello"
//输出："holle"
// 
//
// 示例 2： 
//
// 
//输入：s = "leetcode"
//输出："leotcede" 
//
// 
//
// 提示： 
//
// 
// 1 <= s.length <= 3 * 10⁵ 
// s 由 可打印的 ASCII 字符组成 
// 
//
// Related Topics 双指针 字符串 👍 327 👎 0


package LeetCode.editor.cn;

import java.util.Set;

/**
 * @author ldltd
 * @date 2023-09-24 00:40:24
 * @description 345.反转字符串中的元音字母
 */
public class ReverseVowelsOfAString{
	 public static void main(String[] args) {
	 	 //测试代码
	 	 Solution solution = new ReverseVowelsOfAString().new Solution();
			solution.reverseVowels("hello");
	 }
	 
//力扣代码
//leetcode submit region begin(Prohibit modification and deletion)
class Solution {
    public String reverseVowels(String s) {
		int l=0,r=s.length()-1;
		Set<Character> set=Set.of('a','e','i','o','u','A','E','I','O','U');
		StringBuffer str = new StringBuffer(s);
		while (l<r){
			while (l<s.length()&&!set.contains(s.charAt(l))) l++;
			while (r>0&&!set.contains(s.charAt(r))) r--;
			if(l>=r) return str.toString();
			char t=s.charAt(l);
			str.replace(l,l+1, String.valueOf(s.charAt(r)));
			str.replace(r,r+1,String.valueOf(t));
			l++;
			r--;
		}
		return str.toString();
    }

	public String reverseVowels1(String s) {
		int n = s.length();
		char[] arr = s.toCharArray();
		int i = 0, j = n - 1;
		while (i < j) {
			while (i < n && !isVowel(arr[i])) {
				++i;
			}
			while (j > 0 && !isVowel(arr[j])) {
				--j;
			}
			if (i < j) {
				swap(arr, i, j);
				++i;
				--j;
			}
		}
		return new String(arr);
	}

	public boolean isVowel(char ch) {
		return "aeiouAEIOU".indexOf(ch) >= 0;
	}

	public void swap(char[] arr, int i, int j) {
		char temp = arr[i];
		arr[i] = arr[j];
		arr[j] = temp;
	}

}
//leetcode submit region end(Prohibit modification and deletion)

}
